package generic;

/**
 * Creared with IntelliJ IDEA.
 * Description:
 * User:yxd
 * Date:2022-02-20
 * Time:13:46
 */

//泛型 是编译期的一种机制 擦除机制 运行时会被擦除  泛型尖括号当中的内容不参与类型的组成  运行时<T>会被替换为Object
class MyArray<T> {//泛型  可以指定  顺序表类型 T是一个占位符
    //public Object[] objects = new Object[10];
    public T[] objects = (T[]) new Object[10];//这样其实也是不准确的 也不能直接写为Object类型的也有可能放入任何类型的数组
    //public T[] objects =  new T[10];
    //直接写成T的也会出错  底层JVM里面不允许
    // 就和前面的一样报错直接写成Object 后面接收的时候会出错（数组之间的转换不能整体强转  里面的内容是没有转的）
    // 最正确的应该使用反射来写
    /*public MyArray(Class<T> clazz, int capacity) { //Class<T> clazz指定了类型 这样才能创建泛型数组
        array = (T[])Array.newInstance(clazz, capacity);
    }*/

    public void set(int pos,T val){
        objects[pos] = val;
    }
    public T get(int pos){
        return objects[pos];
    }
    //如果这样的话，不论是String Integer,Double 都可以放入里面，那么该用什么来接受呢因此也不能直接new一个T类型的数组
    public T[] getArray(int pos){
        return objects;
    }
}
public class Fan {
    public static void main(String[] args) {
        //MyArray myArray = new MyArray(); 此时局限性太大  只能放int类型的
        //myArray.add(1);
        //使用泛型后可以自己指定类型  可以把类型作为参数 来传递
        MyArray<String> myArray = new MyArray<>();
        myArray.set(0,"jadsj");//编译时会自己检查对类型是否匹配  如果不匹配  会报错
        myArray.set(1,"hhh");
        String str = myArray.get(1);//获取一位置的元素
        System.out.println(str);
        MyArray<Integer> myArray1 = new MyArray<>();
        myArray1.set(0,1);
        int a = myArray1.get(0);
        System.out.println(a);
        MyArray myArray2 = new MyArray();//裸类型如果这样写的话具体的泛型是没有使用到的，又返回去什么都可以放的地步了
    }
}

